#include <bits/stdc++.h>
using namespace std;

/*
3136. 有效单词
已解答
简单
相关标签
premium lock icon
相关企业
提示
有效单词 需要满足以下几个条件：

至少 包含 3 个字符。
由数字 0-9 和英文大小写字母组成。（不必包含所有这类字符。）
至少 包含一个 元音字母 。
至少 包含一个 辅音字母 。
给你一个字符串 word 。如果 word 是一个有效单词，则返回 true ，否则返回 false 。

注意：

'a'、'e'、'i'、'o'、'u' 及其大写形式都属于 元音字母 。
英文中的 辅音字母 是指那些除元音字母之外的字母。
 

示例 1：

输入：word = "234Adas"

输出：true

解释：

这个单词满足所有条件。

示例 2：

输入：word = "b3"

输出：false

解释：

这个单词的长度少于 3 且没有包含元音字母。

示例 3：

输入：word = "a3$e"

输出：false

解释：

这个单词包含了 '$' 字符且没有包含辅音字母。

 

提示：

1 <= word.length <= 20
word 由英文大写和小写字母、数字、'@'、'#' 和 '$' 组成。
*/

// 法一
class Solution {
public:
    bool isValid(string word) {
        // 至少3个字符
        if (word.length() < 3)      return false;

        bool hasVowel = false;
        bool hasConsonant = false;

        // 每个字符都要检查是不是有效
        for (char ch : word) {
            // 先检查是否有非数字字母字符
            if (!std::isalnum(ch))  return false;
            // 是否为字母
            if (std::isalpha(ch)) {
                // 都转成小写
                char lower = std::tolower(ch);
                // 元音
                if (lower == 'a' || lower == 'e' || lower == 'i' || lower == 'o' || lower == 'u')   hasVowel = true;
                else    hasConsonant = true;
            }
        }
        return hasConsonant && hasVowel;
    }
};